package ar.edu.unlam.lyc.analizadorLexico;

public class Token {

	private static int LAST_TOKEN_ID = 0;

	public int id;
	public String token = "";
	public TipoDato tipo = TipoDato.NULL;
	public String ambito = "";
	public boolean identificador = false;
	public boolean constanteE = false;
	public boolean constanteR = false;
	public boolean constanteS = false;
	public boolean reservada = false;
	public String mnemonic;
	public String otros = "-";
	public boolean declarado = false;
	public boolean utilizado = false;

	public static String[] cadenaFormatoTS = { "ID", "NOMBRE", "TIPO",
			"AMBITO", "OTROS" };

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Token other = (Token) obj;
		if (ambito == null) {
			if (other.ambito != null)
				return false;
		} else if (!ambito.equals(other.ambito) && !"FUNCTION".equals(otros))
			return false;
		if (token == null) {
			if (other.token != null)
				return false;
		} else if (!token.equals(other.token) && !"FUNCTION".equals(otros))
			return false;
		return true;
	}

	public boolean equals(String str) {
		return this.token.equals(str);
	}

	public String toString() {
		String modificador = "";
		if (this.identificador) {
			modificador = "id: ";
		}
		if (this.reservada) {
			modificador = "rsv: ";
		}
		return "< " + modificador + this.token + " >";
	}

	public String toStringMN() {
		return "< " + this.mnemonic + " >";
	}

	public String toStringTS() {
		if (this.token.length() > 6) {
			return this.token.substring(0, 7) + "\t" + this.tipo + "\t"
					+ this.ambito + "\t" + otros;
		}
		return this.token + "\t\t" + this.tipo + "\t" + this.ambito + "\t"
				+ otros;
	}

	public String[] getPrintableRow() {
		return new String[] { "" + this.id, this.token.toUpperCase(),
				this.tipo.toString(), this.ambito.toUpperCase(),
				this.otros.toUpperCase() };
	}

	public boolean esIdentificador() {
		switch (this.tipo) {
		case VAR_STRING:
		case VAR_INT:
		case VAR_REAL:
		case FUNC_STRING:
		case FUNC_INT:
		case FUNC_REAL:
			return true;
		default:
			return this.identificador;
		}
	}

	public boolean esConstanteS() {
		return this.tipo.equals(TipoDato.CTE_STRING);
	}

	public boolean esConstanteR() {
		return this.tipo.equals(TipoDato.CTE_REAL);
	}

	public boolean esConstanteE() {
		return this.tipo.equals(TipoDato.CTE_INT);
	}

	public void setId() {
		Token.LAST_TOKEN_ID += 1;
		this.id = Token.LAST_TOKEN_ID;
	}
}
